ZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX3NwdW5rL01ha2VmaWxlIGIvYm9hcmQvc2M1MjBfc3B1bmsvTWFrZWZpbGUKaW5kZXggZTA0MTcyZS4uMDZmYTJmMyAxMDA2NDQKLS0tIGEvYm9hcmQvc2M1MjBfc3B1bmsvTWFrZWZpbGUKKysrIGIvYm9hcmQvc2M1MjBfc3B1bmsvTWFrZWZpbGUKQEAgLTI4LDEyICsyOCwxNCBAQAogCiBMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCiAKLUNPQkpTCTo9IHNjNTIwX3NwdW5rLm8gZmxhc2gubwotU09CSlMJOj0gc2M1MjBfc3B1bmtfYXNtLm8gc2M1MjBfc3B1bmtfYXNtMTYubworQ09CSlMteQkrPSBzYzUyMF9zcHVuay5vCitDT0JKUy15CSs9IGZsYXNoLm8KK0NPQkpTLSQoQ09ORklHX1BDSSkgKz0gc2M1MjBfc3B1bmtfcGNpLm8KK1NPQkpTLXkJKz0gc2M1MjBfc3B1bmtfYXNtLm8KK1NPQkpTLXkJKz0gc2M1MjBfc3B1bmtfYXNtMTYubwogCi1TUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCi1PQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKLVNPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKK1NSQ1MJOj0gJChTT0JKUy15Oi5vPS5TKSAkKENPQkpTLXk6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTLXkpICQoQ09CSlMteSkpCiAKICQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCiAJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCmRpZmYgLS1naXQgYS9ib2FyZC9zYzUyMF9zcHVuay9zYzUyMF9zcHVuay5jIGIvYm9hcmQvc2M1MjBfc3B1bmsvc2M1MjBfc3B1bmsuYwppbmRleCBkYmI1YzQ4Li4wOWYxMWJiIDEwMDY0NAotLS0gYS9ib2FyZC9zYzUyMF9zcHVuay9zYzUyMF9zcHVuay5jCisrKyBiL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rLmMKQEAgLTIzLDEzICsyMywxMCBAQAogICovCiAKICNpbmNsdWRlIDxjb21tb24uaD4KLSNpbmNsdWRlIDxwY2kuaD4KICNpbmNsdWRlIDxuZXRkZXYuaD4KICNpbmNsdWRlIDxkczE3MjIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+Ci0jaW5jbHVkZSA8YXNtL2ljL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9pYy9zc2kuaD4KIAogREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CkBAIC05OCwxNTYgKzk1LDYgQEAKIAogfQogCi0KLS8qIFBDSSBzdHVmZiAqLwotc3RhdGljIHZvaWQgcGNpX3NjNTIwX3NwdW5rX2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCi17Ci0JaW50IHZlcnNpb24gPSBzYzUyMF9tbWNyLT5zeXNpbmZvOwotCi0JLyogYSBjb25maWd1cmFibGUgbGlzdHMgb2YgaXJxcyB0byBzdGVhbAotCSAqIHdoZW4gd2UgbmVlZCBvbmUgKGEgYm9hcmQgd2l0aCBtb3JlIHBjaSBpbnRlcnJ1cHQgcGlucwotCSAqIHdvdWxkIHVzZSBhIGxhcmdlciB0YWJsZSAqLwotCXN0YXRpYyBpbnQgaXJxX2xpc3RbXSA9IHsKLQkJQ09ORklHX1NZU19GSVJTVF9QQ0lfSVJRLAotCQlDT05GSUdfU1lTX1NFQ09ORF9QQ0lfSVJRLAotCQlDT05GSUdfU1lTX1RISVJEX1BDSV9JUlEsCi0JCUNPTkZJR19TWVNfRk9SVEhfUENJX0lSUQotCX07Ci0Jc3RhdGljIGludCBuZXh0X2lycV9pbmRleD0wOwotCi0JdWNoYXIgdG1wX3BpbjsKLQlpbnQgcGluOwotCi0JcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmdG1wX3Bpbik7Ci0JcGluID0gdG1wX3BpbjsKLQotCXBpbi09MTsgLyogcGNpIGNvbmZpZyBzcGFjZSB1c2UgMS1iYXNlZCBudW1iZXJpbmcgKi8KLQlpZiAoLTEgPT0gcGluKSB7Ci0JCXJldHVybjsgLyogZGV2aWNlIHVzZSBubyBpcnEgKi8KLQl9Ci0KLQotCS8qIG1hcCBkZXZpY2UgbnVtYmVyICsgIHBpbiB0byBhIHBpbiBvbiB0aGUgc2M1MjAgKi8KLQlzd2l0Y2ggKFBDSV9ERVYoZGV2KSkgewotCWNhc2UgNjogIC8qIEVUSDAgKi8KLQkJcGluKz1TQzUyMF9QQ0lfSU5UQTsKLQkJYnJlYWs7Ci0KLQljYXNlIDc6ICAvKiBFVEgxICovCi0JCXBpbis9U0M1MjBfUENJX0lOVEI7Ci0JCWJyZWFrOwotCi0JY2FzZSA4OiAgLyogQ3J5cHRvICovCi0JCXBpbis9U0M1MjBfUENJX0lOVEM7Ci0JCWJyZWFrOwotCi0JY2FzZSA5OiAvKiBQTUMgc2xvdCAqLwotCQlwaW4rPVNDNTIwX1BDSV9JTlREOwotCQlicmVhazsKLQotCWNhc2UgMTA6IC8qIFBDLUNhcmQgKi8KLQotCQlpZiAodmVyc2lvbiA8IDEwKSB7Ci0JCQlwaW4rPVNDNTIwX1BDSV9JTlREOwotCQl9IGVsc2UgewotCQkJcGluKz1TQzUyMF9QQ0lfSU5UQzsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQlwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCi0KLQlpZiAoc2M1MjBfcGNpX2ludHNbcGluXSA9PSAtMSkgewotCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwotCQlpZiAobmV4dF9pcnFfaW5kZXggPiAzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBjaV9zYzUyMF9zZXRfaXJxKHBpbiwgaXJxX2xpc3RbbmV4dF9pcnFfaW5kZXhdKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCW5leHRfaXJxX2luZGV4Kys7Ci0JfQotCi0KLQlpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgewotCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKLQkJCQkJICAgc2M1MjBfcGNpX2ludHNbcGluXSk7Ci0JfQotI2lmIDAKLQlwcmludGYoImZpeHVwX2lycTogZGV2aWNlICVkIHBpbiAlYyBpcnEgJWRcbiIsCi0JICAgICAgIFBDSV9ERVYoZGV2KSwgJ0EnICsgcGluLCBzYzUyMF9wY2lfaW50c1twaW5dKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyB2b2lkIHBjaV9zYzUyMF9zcHVua19jb25maWd1cmVfY2FyZGJ1cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICp0ZSkKLXsKLQl1MzIgaW9fYmFzZTsKLQl1MzIgdGVtcDsKLQotCXBjaWF1dG9fY29uZmlnX2RldmljZShob3NlLCBkZXYpOwotCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgMHgwNyk7ICAvKiBlbmFibGUgZGV2aWNlICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDBjLCAweDEwKTsgICAgICAgICAvKiBjYWNoZWxpbmUgc2l6ZSAqLwotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHgwZCwgMHg0MCk7ICAgICAgICAgLyogbGF0ZW5jeSB0aW1lciAqLwotCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHgxYiwgMHg0MCk7ICAgICAgICAgLyogY2FyZGJ1cyBsYXRlbmN5IHRpbWVyICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsIDB4MDA0MCk7ICAvKiByZXNldCBjYXJkYnVzICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsIDB4MDA4MCk7ICAvKiByb3V0ZSBpbnRlcnJ1cHRzIHRob3VnaCBFeENBICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAgMHg0NCwgMHgzZTApOyAvKiBtYXAgbGVnYWN5IEkvTyBwb3J0IHRvIDB4M2UwICovCi0KLQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsICAweDgwLCAmdGVtcCk7IC8qIFN5c3RlbSBjb250cm9sICovCi0JcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgIDB4ODAsIHRlbXAgfCAweDYwKTsgLyogU3lzdGVtIGNvbnRyb2w6IGRpc2FibGUgY2xvY2tydW4gKi8KLQkvKiByb3V0ZSBNRjAgdG8gfklOVCBhbmQgTUYzIHRvIElSUTcKLQkgKiByZXNlcnZlIGFsbCBvdGhlcnMgKi8KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCAweDhjLCAweDAwMDA3MDAyKTsKLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTEsIDB4MDApOyAgICAvKiBjYXJkIGNvbnRyb2wgKi8KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTIsIDB4NjIpOyAgICAvKiBkZXZpY2UgY29udHJvbCAqLwotCi0JaWYgKHRlLT5kZXZpY2UgIT0gMHhhYzU2KSB7Ci0JCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHg5MywgMHgyMSk7ICAgIC8qIGFzeW5jIGludGVycnVwdCBlbmFibGUgKi8KLQkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGE4LCAweDAwMDApOyAgLyogcmVzZXQgR1BJTyAqLwotCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIDB4YWMsIDB4MDAwMCk7ICAvKiByZXNldCBHUElPICovCi0JCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgMHhhYSwgMHgwMDAwKTsgIC8qIHJlc2V0IEdQSU8gKi8KLQkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGFlLCAweDAwMDApOyAgLyogcmVzZXQgR1BJTyAqLwotCX0gZWxzZSB7Ci0JCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHg5MywgMHgyMCk7ICAgIC8qICAqLwotCX0KLQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIDB4YTQsIDB4ODAwMCk7ICAvKiByZXNldCBwb3dlciBtYW5hZ2VtZW50ICovCi0KLQotCXBjaV9ob3NlX3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmaW9fYmFzZSk7Ci0JaW9fYmFzZSAmPSB+MHhmTDsKLQotCXdyaXRlYigweDA3LCBpb19iYXNlKzB4ODAzKTsgLyogcm91dGUgQ1NDIGlycSB0aG91Z2ggRXhDQSBhbmQgZW5hYmxlIElSUTcgKi8KLQl3cml0ZWwoMCwgaW9fYmFzZSsweDEwKTsgICAgIC8qIENMS1JVTiBkZWZhdWx0ICovCi0Jd3JpdGVsKDAsIGlvX2Jhc2UrMHgyMCk7ICAgICAvKiBDTEtSVU4gZGVmYXVsdCAqLwotCi19Ci0KLQotc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV9zYzUyMF9zcHVua19jb25maWdfdGFibGVbXSA9IHsKLQl7IDB4MTA0YywgMHhhYzUwLCBQQ0lfQU5ZX0lELCAwLCAweDBhLCAwLCBwY2lfc2M1MjBfc3B1bmtfY29uZmlndXJlX2NhcmRidXMsIHsgMCwgMCwgMH0gfSwKLQl7IDB4MTA0YywgMHhhYzU2LCBQQ0lfQU5ZX0lELCAwLCAweDBhLCAwLCBwY2lfc2M1MjBfc3B1bmtfY29uZmlndXJlX2NhcmRidXMsIHsgMCwgMCwgMH0gfSwKLQl7IDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIHswLDAsMH19Ci19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHNjNTIwX3NwdW5rX2hvc2UgPSB7Ci0JZml4dXBfaXJxOiBwY2lfc2M1MjBfc3B1bmtfZml4dXBfaXJxLAotCWNvbmZpZ190YWJsZTogcGNpX3NjNTIwX3NwdW5rX2NvbmZpZ190YWJsZSwKLQlmaXJzdF9idXNubzogMHgwMCwKLQlsYXN0X2J1c25vOiAweGZmLAotfTsKLQotdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQotewotCXBjaV9zYzUyMF9pbml0KCZzYzUyMF9zcHVua19ob3NlKTsKLX0KLQotCiAvKiBzZXQgdXAgdGhlIElTQSBidXMgdGltaW5nIGFuZCBzeXN0ZW0gYWRkcmVzcyBtYXBwaW5ncyAqLwogc3RhdGljIHZvaWQgYnVzX2luaXQodm9pZCkKIHsKQEAgLTMzNCwxNTEgKzE4MSw2IEBACiAgKi8KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKLSAqIG9mIHRoZSBzeXN0ZW0gYWRkcmVzcyBzcGFjZSB0byB0aGUgSVNBIGJ1cwotICoKLSAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbWVtb3J5IGFkZHJlc3MKLSAqIGFzIHNlZW4gYnkgdGhlIGhvc3QgKHdoaWNoIG1heSB2ZXJ5IHdpbGwgYmUgdGhlCi0gKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKLSAqLwotdTMyIGlzYV9tYXBfcm9tKHUzMiBidXNfYWRkciwgaW50IHNpemUpCi17Ci0JdTMyIHBhcjsKLQotCXByaW50ZigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAotCSAgICAgICBzaXplLCBidXNfYWRkcik7Ci0KLQlwYXIgPSBzaXplOwotCWlmIChwYXIgPCAweDgwMDAwKSB7Ci0JCXBhciA9IDB4ODAwMDA7Ci0JfQotCXBhciA+Pj0gMTI7Ci0JcGFyLS07Ci0JcGFyJj0weDdmOwotCXBhciA8PD0gMTg7Ci0JcGFyIHw9IChidXNfYWRkcj4+MTIpOwotCXBhciB8PSAweDUwMDAwMDAwOwotCi0JcHJpbnRmICgic2V0dGluZyBQQVIxMSB0byAleFxuIiwgcGFyKTsKLQotCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KLQlzYzUyMF9tbWNyLT5wYXJbMTFdID0gcGFyOwotCi0JcmV0dXJuIGJ1c19hZGRyOwotfQotCi0vKgotICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKLSAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKLSAqLwotdm9pZCBpc2FfdW5tYXBfcm9tKHUzMiBhZGRyKQotewotCXByaW50ZigiaXNhX3VubWFwX3JvbSBhc2tlZCB0byB1bm1hcCAleCIsIGFkZHIpOwotCWlmICgoYWRkcj4+MTIpID09IChzYzUyMF9tbWNyLT5wYXJbMTFdICYgMHgzZmZmZikpIHsKLQkJc2M1MjBfbW1jci0+cGFyWzExXSA9IDA7Ci0JCXByaW50ZigiIGRvbmVcbiIpOwotCQlyZXR1cm47Ci0JfQotCXByaW50ZigiIG5vdCBvdXJzXG4iKTsKLX0KLQotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgUENJX1JPTV9URU1QX1NQQUNFIDB4MTAwMDAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtYXAgYSBjaHVuayBvZiBzaXplIGJ5dGVzCi0gKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIFBDSSBidXMsCi0gKiBzdWl0YWJsZSB0byBtYXAgUENJIFJPTVMgKGJ1cyBhZGRyZXNzIDwgMTZNKQotICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBob3N0IG1lbW9yeSBhZGRyZXNzCi0gKiB3aGljaCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBidXMgYWRkcmVzcwotICogYmVmb3JlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQQ0kgcm9tIGFkZHJlc3MKLSAqIGRlY29kZXIKLSAqLwotdTMyIHBjaV9nZXRfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBzaXplKQotewotCXUzMiBwYXI7Ci0KLQlwYXIgPSBzaXplOwotCWlmIChwYXIgPCAweDgwMDAwKSB7Ci0JCXBhciA9IDB4ODAwMDA7Ci0JfQotCXBhciA+Pj0gMTY7Ci0JcGFyLS07Ci0JcGFyJj0weDdmZjsKLQlwYXIgPDw9IDE0OwotCXBhciB8PSAoUENJX1JPTV9URU1QX1NQQUNFPj4xNik7Ci0JcGFyIHw9IDB4NzIwMDAwMDA7Ci0KLQlwcmludGYgKCJzZXR0aW5nIFBBUjEgdG8gJXhcbiIsIHBhcik7Ci0KLQkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCi0Jc2M1MjBfbW1jci0+cGFyWzFdID0gcGFyOwotCi0JcmV0dXJuIFBDSV9ST01fVEVNUF9TUEFDRTsKLX0KLQotLyoKLSAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCi0gKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCi0gKi8KLXZvaWQgcGNpX3JlbW92ZV9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGFkZHIpCi17Ci0JcHJpbnRmKCJwY2lfcmVtb3ZlX3JvbV93aW5kb3c6ICV4IiwgYWRkcik7Ci0JaWYgKGFkZHIgPT0gUENJX1JPTV9URU1QX1NQQUNFKSB7Ci0JCXNjNTIwX21tY3ItPnBhclsxXSA9IDA7Ci0JCXByaW50ZigiIGRvbmVcbiIpOwotCQlyZXR1cm47Ci0JfQotCXByaW50ZigiIG5vdCBvdXJzXG4iKTsKLQotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhY2NlcyB0byB0aGUKLSAqIGxlZ2FjeSB2aWRlbyBJL08gcG9ydHMgb24gdGhlIFBDSSBidXMuCi0gKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIHRvIEkvTyBwb3J0cyAweDNiMC0weDNiYiBhbmQKLSAqIDB4M2MwLTB4M2RmIHNodWxkIHJlc3VsdCBpbiB0cmFuc2FjdGlvbnMgb24gdGhlIFBDSSBidXMuCi0gKgotICovCi1pbnQgcGNpX2VuYWJsZV9sZWdhY3lfdmlkZW9fcG9ydHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQotewotCS8qIE1hcCB2aWRlbyBtZW1vcnkgdG8gMHhhMDAwMCovCi0Jc2M1MjBfbW1jci0+cGFyWzBdID0gMHg3MjAwNDAwYTsKLQotCS8qIGZvcndhcmQgYWxsIEkvTyBhY2Nlc3NlcyB0byBQQ0kgKi8KLQlzYzUyMF9tbWNyLT5hZGRkZWNjdGwgPSBzYzUyMF9tbWNyLT5hZGRkZWNjdGwgfCBJT19IT0xFX0RFU1RfUENJOwotCi0KLQkvKiBzbyB3ZSBtYXAgYXdheSBhbGwgaW8gcG9ydHMgdG8gcGNpIChvbmx5IHdheSB0byBhY2Nlc3MgcGNpIGlvCi0JICogYmVsb3cgMHg0MDAuIEJ1dCB0aGVuIHdlIGhhdmUgdG8gbWFwIGJhY2sgdGhlIHBvcnRpb25zIHRoYXQgd2UgZG9udAotCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCi0JICogSVNBIHNsb3RzIGFyZSBjb25uZWN0ZWQsIHRoaXMgcmVxdXJlIHRoZSB1c2Ugb2Ygc2V2ZXJhbCBQQVIgcmVnaXN0ZXJzCi0JICovCi0KLQkvKiBicmluZyAweDEwMCAtIDB4MmY3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjUgKi8KLQlzYzUyMF9tbWNyLT5wYXJbNV0gPSAweDMxZjcwMTAwOwotCi0JLyogY29tMiB1c2UgMmY4LTJmZiAqLwotCi0JLyogYnJpbmcgMHgzMDAgLSAweDNhZiBiYWNrIHRvIElTQSB1c2luZyBQQVI3ICovCi0Jc2M1MjBfbW1jci0+cGFyWzddID0gMHgzMGFmMDMwMDsKLQotCS8qIHZnYSB1c2UgM2IwLTNiYiAqLwotCi0JLyogYnJpbmcgMHgzYmMgLSAweDNiZiBiYWNrIHRvIElTQSB1c2luZyBQQVI4ICovCi0Jc2M1MjBfbW1jci0+cGFyWzhdID0gMHgzMDAzMDNiYzsKLQotCS8qIHZnYSB1c2UgM2MwLTNkZiAqLwotCi0JLyogYnJpbmcgMHgzZTAgLSAweDNmNyBiYWNrIHRvIElTQSB1c2luZyBQQVI5ICovCi0Jc2M1MjBfbW1jci0+cGFyWzldID0gMHgzMDE3MDNlMDsKLQotCS8qIGNvbTEgdXNlIDNmOC0zZmYgKi8KLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qCiAgKiBNaXNjZWxhbmVvdXMgcGxhdGZvcm0gZGVwZW5kZW50IGluaXRpYWxpc2F0aW9ucwogICovCiAKZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rX3BjaS5jIGIvYm9hcmQvc2M1MjBfc3B1bmsvc2M1MjBfc3B1bmtfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI1ZDBmMQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL3NjNTIwX3NwdW5rL3NjNTIwX3NwdW5rX3BjaS5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8ZHMxNzIyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgorI2luY2x1ZGUgPGFzbS9pYy9wY2kuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0YXRpYyB2b2lkIHBjaV9zYzUyMF9zcHVua19maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworCWludCB2ZXJzaW9uID0gc2M1MjBfbW1jci0+c3lzaW5mbzsKKworCS8qIGEgY29uZmlndXJhYmxlIGxpc3RzIG9mIGlycXMgdG8gc3RlYWwKKwkgKiB3aGVuIHdlIG5lZWQgb25lIChhIGJvYXJkIHdpdGggbW9yZSBwY2kgaW50ZXJydXB0IHBpbnMKKwkgKiB3b3VsZCB1c2UgYSBsYXJnZXIgdGFibGUgKi8KKwlzdGF0aWMgaW50IGlycV9saXN0W10gPSB7CisJCUNPTkZJR19TWVNfRklSU1RfUENJX0lSUSwKKwkJQ09ORklHX1NZU19TRUNPTkRfUENJX0lSUSwKKwkJQ09ORklHX1NZU19USElSRF9QQ0lfSVJRLAorCQlDT05GSUdfU1lTX0ZPUlRIX1BDSV9JUlEKKwl9OworCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKKworCXVjaGFyIHRtcF9waW47CisJaW50IHBpbjsKKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOworCXBpbiA9IHRtcF9waW47CisKKwlwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCisJaWYgKC0xID09IHBpbikgeworCQlyZXR1cm47IC8qIGRldmljZSB1c2Ugbm8gaXJxICovCisJfQorCisKKwkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCisJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKKwljYXNlIDY6ICAvKiBFVEgwICovCisJCXBpbis9U0M1MjBfUENJX0lOVEE7CisJCWJyZWFrOworCisJY2FzZSA3OiAgLyogRVRIMSAqLworCQlwaW4rPVNDNTIwX1BDSV9JTlRCOworCQlicmVhazsKKworCWNhc2UgODogIC8qIENyeXB0byAqLworCQlwaW4rPVNDNTIwX1BDSV9JTlRDOworCQlicmVhazsKKworCWNhc2UgOTogLyogUE1DIHNsb3QgKi8KKwkJcGluKz1TQzUyMF9QQ0lfSU5URDsKKwkJYnJlYWs7CisKKwljYXNlIDEwOiAvKiBQQy1DYXJkICovCisKKwkJaWYgKHZlcnNpb24gPCAxMCkgeworCQkJcGluKz1TQzUyMF9QQ0lfSU5URDsKKwkJfSBlbHNlIHsKKwkJCXBpbis9U0M1MjBfUENJX0lOVEM7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJcGluJj0zOyAvKiB3cmFwIGFyb3VuZCAqLworCisJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKKwkJLyogcmUtcm91dGUgb25lIGludGVycnVwdCBmb3IgdXMgKi8KKwkJaWYgKG5leHRfaXJxX2luZGV4ID4gMykgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChwY2lfc2M1MjBfc2V0X2lycShwaW4sIGlycV9saXN0W25leHRfaXJxX2luZGV4XSkpIHsKKwkJCXJldHVybjsKKwkJfQorCQluZXh0X2lycV9pbmRleCsrOworCX0KKworCisJaWYgKC0xICE9IHNjNTIwX3BjaV9pbnRzW3Bpbl0pIHsKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsCisJCQkJCSAgIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOworCX0KKyNpZiAwCisJcHJpbnRmKCJmaXh1cF9pcnE6IGRldmljZSAlZCBwaW4gJWMgaXJxICVkXG4iLAorCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiwgc2M1MjBfcGNpX2ludHNbcGluXSk7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBwY2lfc2M1MjBfc3B1bmtfY29uZmlndXJlX2NhcmRidXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkgICAgICBwY2lfZGV2X3QgZGV2LCBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqdGUpCit7CisJdTMyIGlvX2Jhc2U7CisJdTMyIHRlbXA7CisKKwlwY2lhdXRvX2NvbmZpZ19kZXZpY2UoaG9zZSwgZGV2KTsKKworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIDB4MDcpOyAgLyogZW5hYmxlIGRldmljZSAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgMHgwYywgMHgxMCk7ICAgICAgICAgLyogY2FjaGVsaW5lIHNpemUgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4MGQsIDB4NDApOyAgICAgICAgIC8qIGxhdGVuY3kgdGltZXIgKi8KKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4MWIsIDB4NDApOyAgICAgICAgIC8qIGNhcmRidXMgbGF0ZW5jeSB0aW1lciAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0JSSURHRV9DT05UUk9MLCAweDAwNDApOyAgLyogcmVzZXQgY2FyZGJ1cyAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0JSSURHRV9DT05UUk9MLCAweDAwODApOyAgLyogcm91dGUgaW50ZXJydXB0cyB0aG91Z2ggRXhDQSAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgIDB4NDQsIDB4M2UwKTsgLyogbWFwIGxlZ2FjeSBJL08gcG9ydCB0byAweDNlMCAqLworCisJcGNpX2hvc2VfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCAgMHg4MCwgJnRlbXApOyAvKiBTeXN0ZW0gY29udHJvbCAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCBkZXYsICAweDgwLCB0ZW1wIHwgMHg2MCk7IC8qIFN5c3RlbSBjb250cm9sOiBkaXNhYmxlIGNsb2NrcnVuICovCisJLyogcm91dGUgTUYwIHRvIH5JTlQgYW5kIE1GMyB0byBJUlE3CisJICogcmVzZXJ2ZSBhbGwgb3RoZXJzICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGRldiwgMHg4YywgMHgwMDAwNzAwMik7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDkxLCAweDAwKTsgICAgLyogY2FyZCBjb250cm9sICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCAweDkyLCAweDYyKTsgICAgLyogZGV2aWNlIGNvbnRyb2wgKi8KKworCWlmICh0ZS0+ZGV2aWNlICE9IDB4YWM1NikgeworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTMsIDB4MjEpOyAgICAvKiBhc3luYyBpbnRlcnJ1cHQgZW5hYmxlICovCisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgMHhhOCwgMHgwMDAwKTsgIC8qIHJlc2V0IEdQSU8gKi8KKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGFjLCAweDAwMDApOyAgLyogcmVzZXQgR1BJTyAqLworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIDB4YWEsIDB4MDAwMCk7ICAvKiByZXNldCBHUElPICovCisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgMHhhZSwgMHgwMDAwKTsgIC8qIHJlc2V0IEdQSU8gKi8KKwl9IGVsc2UgeworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIDB4OTMsIDB4MjApOyAgICAvKiAgKi8KKwl9CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCAweGE0LCAweDgwMDApOyAgLyogcmVzZXQgcG93ZXIgbWFuYWdlbWVudCAqLworCisKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCwgJmlvX2Jhc2UpOworCWlvX2Jhc2UgJj0gfjB4Zkw7CisKKwl3cml0ZWIoMHgwNywgaW9fYmFzZSsweDgwMyk7IC8qIHJvdXRlIENTQyBpcnEgdGhvdWdoIEV4Q0EgYW5kIGVuYWJsZSBJUlE3ICovCisJd3JpdGVsKDAsIGlvX2Jhc2UrMHgxMCk7ICAgICAvKiBDTEtSVU4gZGVmYXVsdCAqLworCXdyaXRlbCgwLCBpb19iYXNlKzB4MjApOyAgICAgLyogQ0xLUlVOIGRlZmF1bHQgKi8KKworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBwY2lfc2M1MjBfc3B1bmtfY29uZmlnX3RhYmxlW10gPSB7CisJeyAweDEwNGMsIDB4YWM1MCwgUENJX0FOWV9JRCwgMCwgMHgwYSwgMCwgcGNpX3NjNTIwX3NwdW5rX2NvbmZpZ3VyZV9jYXJkYnVzLCB7IDAsIDAsIDB9IH0sCisJeyAweDEwNGMsIDB4YWM1NiwgUENJX0FOWV9JRCwgMCwgMHgwYSwgMCwgcGNpX3NjNTIwX3NwdW5rX2NvbmZpZ3VyZV9jYXJkYnVzLCB7IDAsIDAsIDB9IH0sCisJeyAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCB7MCwwLDB9fQorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBzYzUyMF9zcHVua19ob3NlID0geworCWZpeHVwX2lycTogcGNpX3NjNTIwX3NwdW5rX2ZpeHVwX2lycSwKKwljb25maWdfdGFibGU6IHBjaV9zYzUyMF9zcHVua19jb25maWdfdGFibGUsCisJZmlyc3RfYnVzbm86IDB4MDAsCisJbGFzdF9idXNubzogMHhmZiwKK307CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKwlwY2lfc2M1MjBfaW5pdCgmc2M1MjBfc3B1bmtfaG9zZSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtYXAgYSBjaHVuayBvZiBzaXplIGJ5dGVzCisgKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIElTQSBidXMKKyAqCisgKiBUaGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG1lbW9yeSBhZGRyZXNzCisgKiBhcyBzZWVuIGJ5IHRoZSBob3N0ICh3aGljaCBtYXkgdmVyeSB3aWxsIGJlIHRoZQorICogc2FtZSBhcyB0aGUgYnVzIGFkZHJlc3MpCisgKi8KK3UzMiBpc2FfbWFwX3JvbSh1MzIgYnVzX2FkZHIsIGludCBzaXplKQoreworCXUzMiBwYXI7CisKKwlwcmludGYoImlzYV9tYXBfcm9tIGFza2VkIHRvIG1hcCAlZCBieXRlcyBhdCAleFxuIiwKKwkgICAgICAgc2l6ZSwgYnVzX2FkZHIpOworCisJcGFyID0gc2l6ZTsKKwlpZiAocGFyIDwgMHg4MDAwMCkgeworCQlwYXIgPSAweDgwMDAwOworCX0KKwlwYXIgPj49IDEyOworCXBhci0tOworCXBhciY9MHg3ZjsKKwlwYXIgPDw9IDE4OworCXBhciB8PSAoYnVzX2FkZHI+PjEyKTsKKwlwYXIgfD0gMHg1MDAwMDAwMDsKKworCXByaW50ZiAoInNldHRpbmcgUEFSMTEgdG8gJXhcbiIsIHBhcik7CisKKwkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCisJc2M1MjBfbW1jci0+cGFyWzExXSA9IHBhcjsKKworCXJldHVybiBidXNfYWRkcjsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCisgKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCisgKi8KK3ZvaWQgaXNhX3VubWFwX3JvbSh1MzIgYWRkcikKK3sKKwlwcmludGYoImlzYV91bm1hcF9yb20gYXNrZWQgdG8gdW5tYXAgJXgiLCBhZGRyKTsKKwlpZiAoKGFkZHI+PjEyKSA9PSAoc2M1MjBfbW1jci0+cGFyWzExXSAmIDB4M2ZmZmYpKSB7CisJCXNjNTIwX21tY3ItPnBhclsxMV0gPSAwOworCQlwcmludGYoIiBkb25lXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYoIiBub3Qgb3Vyc1xuIik7Cit9CisKKyNkZWZpbmUgUENJX1JPTV9URU1QX1NQQUNFIDB4MTAwMDAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtYXAgYSBjaHVuayBvZiBzaXplIGJ5dGVzCisgKiBvZiB0aGUgc3lzdGVtIGFkZHJlc3Mgc3BhY2UgdG8gdGhlIFBDSSBidXMsCisgKiBzdWl0YWJsZSB0byBtYXAgUENJIFJPTVMgKGJ1cyBhZGRyZXNzIDwgMTZNKQorICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBob3N0IG1lbW9yeSBhZGRyZXNzCisgKiB3aGljaCBzaG91bGQgYmUgY29udmVydGVkIGludG8gYSBidXMgYWRkcmVzcworICogYmVmb3JlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQQ0kgcm9tIGFkZHJlc3MKKyAqIGRlY29kZXIKKyAqLwordTMyIHBjaV9nZXRfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBzaXplKQoreworCXUzMiBwYXI7CisKKwlwYXIgPSBzaXplOworCWlmIChwYXIgPCAweDgwMDAwKSB7CisJCXBhciA9IDB4ODAwMDA7CisJfQorCXBhciA+Pj0gMTY7CisJcGFyLS07CisJcGFyJj0weDdmZjsKKwlwYXIgPDw9IDE0OworCXBhciB8PSAoUENJX1JPTV9URU1QX1NQQUNFPj4xNik7CisJcGFyIHw9IDB4NzIwMDAwMDA7CisKKwlwcmludGYgKCJzZXR0aW5nIFBBUjEgdG8gJXhcbiIsIHBhcik7CisKKwkvKiBNYXAgcm9tIDB4MTAwMDAgd2l0aCBQQVIxICovCisJc2M1MjBfbW1jci0+cGFyWzFdID0gcGFyOworCisJcmV0dXJuIFBDSV9ST01fVEVNUF9TUEFDRTsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCisgKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCisgKi8KK3ZvaWQgcGNpX3JlbW92ZV9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGFkZHIpCit7CisJcHJpbnRmKCJwY2lfcmVtb3ZlX3JvbV93aW5kb3c6ICV4IiwgYWRkcik7CisJaWYgKGFkZHIgPT0gUENJX1JPTV9URU1QX1NQQUNFKSB7CisJCXNjNTIwX21tY3ItPnBhclsxXSA9IDA7CisJCXByaW50ZigiIGRvbmVcbiIpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiIG5vdCBvdXJzXG4iKTsKKworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSBhY2NlcyB0byB0aGUKKyAqIGxlZ2FjeSB2aWRlbyBJL08gcG9ydHMgb24gdGhlIFBDSSBidXMuCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGFjY2Vzc2VzIHRvIEkvTyBwb3J0cyAweDNiMC0weDNiYiBhbmQKKyAqIDB4M2MwLTB4M2RmIHNodWxkIHJlc3VsdCBpbiB0cmFuc2FjdGlvbnMgb24gdGhlIFBDSSBidXMuCisgKgorICovCitpbnQgcGNpX2VuYWJsZV9sZWdhY3lfdmlkZW9fcG9ydHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qIE1hcCB2aWRlbyBtZW1vcnkgdG8gMHhhMDAwMCovCisJc2M1MjBfbW1jci0+cGFyWzBdID0gMHg3MjAwNDAwYTsKKworCS8qIGZvcndhcmQgYWxsIEkvTyBhY2Nlc3NlcyB0byBQQ0kgKi8KKwlzYzUyMF9tbWNyLT5hZGRkZWNjdGwgPSBzYzUyMF9tbWNyLT5hZGRkZWNjdGwgfCBJT19IT0xFX0RFU1RfUENJOworCisKKwkvKiBzbyB3ZSBtYXAgYXdheSBhbGwgaW8gcG9ydHMgdG8gcGNpIChvbmx5IHdheSB0byBhY2Nlc3MgcGNpIGlvCisJICogYmVsb3cgMHg0MDAuIEJ1dCB0aGVuIHdlIGhhdmUgdG8gbWFwIGJhY2sgdGhlIHBvcnRpb25zIHRoYXQgd2UgZG9udAorCSAqIHVzZSBzbyB0aGF0IHRoZSBnZW5lcmF0ZSBjeWNsZXMgb24gdGhlIEdQSU8gYnVzIHdoZXJlIHRoZSBzaW8gYW5kCisJICogSVNBIHNsb3RzIGFyZSBjb25uZWN0ZWQsIHRoaXMgcmVxdXJlIHRoZSB1c2Ugb2Ygc2V2ZXJhbCBQQVIgcmVnaXN0ZXJzCisJICovCisKKwkvKiBicmluZyAweDEwMCAtIDB4MmY3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjUgKi8KKwlzYzUyMF9tbWNyLT5wYXJbNV0gPSAweDMxZjcwMTAwOworCisJLyogY29tMiB1c2UgMmY4LTJmZiAqLworCisJLyogYnJpbmcgMHgzMDAgLSAweDNhZiBiYWNrIHRvIElTQSB1c2luZyBQQVI3ICovCisJc2M1MjBfbW1jci0+cGFyWzddID0gMHgzMGFmMDMwMDsKKworCS8qIHZnYSB1c2UgM2IwLTNiYiAqLworCisJLyogYnJpbmcgMHgzYmMgLSAweDNiZiBiYWNrIHRvIElTQSB1c2luZyBQQVI4ICovCisJc2M1MjBfbW1jci0+cGFyWzhdID0gMHgzMDAzMDNiYzsKKworCS8qIHZnYSB1c2UgM2MwLTNkZiAqLworCisJLyogYnJpbmcgMHgzZTAgLSAweDNmNyBiYWNrIHRvIElTQSB1c2luZyBQQVI5ICovCisJc2M1MjBfbW1jci0+cGFyWzldID0gMHgzMDE3MDNlMDsKKworCS8qIGNvbTEgdXNlIDNmOC0zZmYgKi8KKworCXJldHVybiAwOworfQo=